<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
  <meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Integrate a Payload with the Data Acquisition Pipeline &mdash; Spot 5.0.1.1 documentation</title>
      <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
      <link rel="stylesheet" href="../../_static/style.css" type="text/css" />
    <link rel="shortcut icon" href="../../_static/bd-favicon.png"/>
    <link rel="canonical" href="https://dev.bostondynamics.com/docs/concepts/writing_services_for_data_acquisition.html" />
  <!--[if lt IE 9]>
    <script src="../../_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
        <script src="../../_static/jquery.js"></script>
        <script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
        <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
        <script src="../../_static/doctools.js"></script>
        <script src="../../_static/sphinx_highlight.js"></script>
    <script src="../../_static/js/theme.js"></script>
    <link rel="index" title="Index" href="../../genindex.html" />
    <link rel="search" title="Search" href="../../search.html" />
    <link rel="next" title="Data Buffer Overview" href="data_buffer_overview.html" />
    <link rel="prev" title="Data Acquisition Output" href="data_acquisition_output.html" /> 
</head>

<body class="wy-body-for-nav"> 
  <div class="wy-grid-for-nav">
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search" >

          
          
          <a href="../../README.html">
            
              <img src="../../_static/bd-official-white.png" class="logo" alt="Logo"/>
          </a>
              <div class="version">
                5.0.1.1
              </div>
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>
        </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
              <ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="README.html">Concepts</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="about_spot.html">About Spot</a></li>
<li class="toctree-l2"><a class="reference internal" href="orbit/about_orbit.html">About Orbit (formerly Scout)</a></li>
<li class="toctree-l2"><a class="reference internal" href="orbit/orbit_api.html">Orbit API</a></li>
<li class="toctree-l2"><a class="reference internal" href="networking.html">Networking</a></li>
<li class="toctree-l2"><a class="reference internal" href="base_services.html">Base services</a></li>
<li class="toctree-l2"><a class="reference internal" href="geometry_and_frames.html">Geometry and Frames</a></li>
<li class="toctree-l2"><a class="reference internal" href="robot_services.html">Robot services</a></li>
<li class="toctree-l2"><a class="reference internal" href="estop_service.html">E-Stop</a></li>
<li class="toctree-l2"><a class="reference internal" href="keepalive_service.html">KeepAlive (BETA)</a></li>
<li class="toctree-l2"><a class="reference internal" href="audio_visual.html">Audio Visual</a></li>
<li class="toctree-l2"><a class="reference internal" href="lease_service.html">Lease</a></li>
<li class="toctree-l2"><a class="reference internal" href="developing_api_services.html">Developing API Services</a></li>
<li class="toctree-l2"><a class="reference internal" href="service_customization.html">Service Customization</a></li>
<li class="toctree-l2"><a class="reference internal" href="faults.html">Faults</a></li>
<li class="toctree-l2"><a class="reference internal" href="autonomy/README.html">Autonomy services</a><ul>
<li class="toctree-l3"><a class="reference internal" href="autonomy/graphnav_tech_summary.html">Autonomy Technical Summary</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/autonomous_navigation_code_examples.html">Autonomous navigation code examples</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/components_of_autonomous_navigation.html">Components of autonomous navigation</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/docking.html">Docking</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/typical_autonomous_navigation_use_case.html">Typical autonomous navigation use case</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/autonomous_navigation_services.html">Autonomous navigation services</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/graphnav_service.html">GraphNav service</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/graphnav_map_structure.html">GraphNav map structure</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/graphnav_area_callbacks.html">GraphNav area callbacks</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/initialization.html">Initialization</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/localization.html">Localization</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/graphnav_and_robot_locomotion.html">GraphNav and robot locomotion</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/missions_service.html">Missions service</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/autowalk_service.html">Autowalk service</a></li>
<li class="toctree-l3"><a class="reference internal" href="network_compute_bridge.html">Network compute bridge</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/auto_return.html">AutoReturn service</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/directed_exploration.html">Directed Exploration</a></li>
<li class="toctree-l3"><a class="reference internal" href="autonomy/gps.html">GPS</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="choreography/README.html">Choreography</a><ul>
<li class="toctree-l3"><a class="reference internal" href="choreography/choreography_service.html">Choreography Service</a></li>
<li class="toctree-l3"><a class="reference internal" href="choreography/move_reference.html">Move Reference Guide</a></li>
<li class="toctree-l3"><a class="reference internal" href="choreography/custom_gait.html">CustomGait Reference</a></li>
<li class="toctree-l3"><a class="reference internal" href="choreography/choreographer_setup.html">Choreographer Setup</a></li>
<li class="toctree-l3"><a class="reference internal" href="choreography/choreographer.html">Choreographer Overview</a></li>
<li class="toctree-l3"><a class="reference internal" href="choreography/robot_controls_in_choreographer.html">Robot Connections in Choreographer</a></li>
<li class="toctree-l3"><a class="reference internal" href="choreography/animations_in_choreographer.html">Animations in Choreography</a></li>
<li class="toctree-l3"><a class="reference internal" href="choreography/animation_file_specification.html">Animation File Format</a></li>
<li class="toctree-l3"><a class="reference internal" href="choreography/choreography_in_tablet.html">Tablet Choreography Mode</a></li>
<li class="toctree-l3"><a class="reference internal" href="choreography/choreography_in_autowalk.html">Choreography Actions in Autowalk</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="joint_control/README.html">Joint Control API</a><ul>
<li class="toctree-l3"><a class="reference internal" href="joint_control/supplemental_data.html">Supplemental Robot Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="joint_control/knee_torque_limits.html">Knee Torque Limits</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="arm/README.html">Spot Arm</a><ul>
<li class="toctree-l3"><a class="reference internal" href="arm/arm_specification.html">Arm and Gripper Specification</a></li>
<li class="toctree-l3"><a class="reference internal" href="arm/arm_concepts.html">Concepts</a></li>
<li class="toctree-l3"><a class="reference internal" href="arm/arm_services.html">Services</a></li>
</ul>
</li>
<li class="toctree-l2 current"><a class="reference internal" href="data.html">Spot Data</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="data_acquisition_overview.html">Data Acquisition Overview</a></li>
<li class="toctree-l3"><a class="reference internal" href="data_acquisition_output.html">Data Acquisition Output</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">Integrate Payloads with the API</a></li>
<li class="toctree-l3"><a class="reference internal" href="data_buffer_overview.html">Data Buffer Overview</a></li>
<li class="toctree-l3"><a class="reference internal" href="bddf.html">BDDF File Format</a></li>
<li class="toctree-l3"><a class="reference internal" href="data_acquisition_thermal_raw.html">Thermal Raw Data Format</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../python/README.html">Python</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../python/quickstart.html">Quickstart</a></li>
<li class="toctree-l2"><a class="reference internal" href="../python/understanding_spot_programming.html">Understanding Spot Programming</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../python/examples/README.html">Examples</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/basic_service_examples.html">Basic Service Examples</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/hello_spot/README.html">Hello Spot</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/directory/README.html">Directory</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_robot_state/README.html">Get Robot State</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_robot_state_async/README.html">Get Robot State Async</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_image/README.html">Get Image</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_world_objects/README.html">Get World Objects</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_mission_state/README.html">Get Mission State</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/estop/README.html">E-Stop</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/time_sync/README.html">Time Sync</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/comms_test/README.html">Comms Test</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/disable_ir_emission/README.html">IR Enable/Disable</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/reset_safety_stop/README.html">Reset Safety Stop</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/audio_visual/audio_visual_params/README.html">Audio Visual Params</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/audio_visual/audio_visual_behaviors/README.html">Audio Visual Behaviors</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/robot_behavior_examples.html">Robot Behavior and Commands Examples</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/stance/README.html">Stance</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/frame_trajectory_command/README.html">Frame Trajectory</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/spot_light/README.html">Spot Light</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/upload_choreographed_sequence/README.html">Upload Choreographed Sequence</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/xbox_controller/README.html">Xbox Controller</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/wasd/README.html">WASD</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/docking/README.html">Docking</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/animation_recorder/README.html">Animation Recorder</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/auto_return/README.html">Auto Return</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/fan_command/README.html">Fan Commands</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_wasd/README.html">ARM WASD</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/arm_examples.html">Arm Command Examples</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_simple/README.html">Simple Arm Motion</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_stow_unstow/README.html">Stow/unstow Arm</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_freeze/README.html">Arm Freeze</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_and_mobility_command/README.html">Arm and Mobility Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_with_body_follow/README.html">Arm Command with Body Following</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_constrained_manipulation/README.html">Arm Constrained Manipulation</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_trajectory/README.html">Arm Trajectory</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_trajectory/README.html#long-trajectory">Long Trajectory</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_joint_move/README.html">Arm Joint Move Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_force_control/README.html">Arm Force Control Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_grasp/README.html">Arm Grasp Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_grasp_carry_overrides/README.html">Arm Grasp and Carry Overrides</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_gaze/README.html">Arm Gaze Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_surface_contact/README.html">Arm Command with Surface Contact</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_door/README.html">Arm Door Opening Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_walk_to_object/README.html">Walk to And Pick Up Object</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_gcode/README.html">Writing Gcode</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/gripper_camera_params/README.html">Gripper Camera Parameters</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_impedance_control/README.html">Arm Impedance Control</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/inverse_kinematics/README.html">Inverse Kinematics</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/arm_wasd/README.html">Arm WASD</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/joint_control/README.html">Wiggle Arm</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/payloads_examples.html">Payloads and Registration Examples</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/payloads/README.html">Payloads</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/self_registration/README.html">Self Registration</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/service_faults/README.html">Faults</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/velodyne_client/README.html">Velodyne</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/core_io_gpio/README.html">CORE I/O GPIO</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/metrics_over_coreio/README.html">Overview</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/metrics_over_coreio/README.html#usage">Usage</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/metrics_over_coreio/README.html#components">Components</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/metrics_over_coreio/README.html#recommended-debugging">Recommended debugging</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/extensions/README.html">Extensions</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/perception_world_objects_examples.html">Perception and World Objects Examples</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_image/README.html">Get Image</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_world_objects/README.html">Get World Objects</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/world_object_with_image_coordinates/README.html">World Object With Image Coordinates</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/world_object_mutations/README.html">World Object Mutations</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/visualizer/README.html">Visualizer</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/gripper_camera_params/README.html">Gripper Camera Parameters</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/spot_cam/README.html">Spot CAM Services</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/spot_cam/README.html#spot-cam-video-core-io-extension-example">Spot Cam Video Core IO Extension Example</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/stitch_front_images/README.html">Stitch Front Images</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_depth_plus_visual_image/README.html">Project Depth Data on Visual Images</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/service_customization/custom_parameter_image_server/README.html">Custom Parameter Image Server</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/fiducial_follow/README.html">Fiducial Follow</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/spot_tensorflow_detector/README.html">Tensorflow Detector</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/service_customization/custom_parameter_ncb_worker/README.html">Custom Parameter Tensorflow Detector</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/network_compute_bridge/README.html">Machine Learning with the Network Compute Bridge</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/network_compute_bridge/fire_extinguisher_server/README.html">Fire Extinguisher Detector with the Network Compute Bridge</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/ray_cast/README.html">Ray Cast</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/user_nogo_regions/README.html">No-Go Regions</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/gps_service/README.html">GPS</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/logging_examples.html">Logging Examples</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/bddf_download/README.html">BDDF Download</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/data_buffer/README.html">Data Buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/data_service/README.html">Data Service</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/logging/README.html">Logging</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/log_status/README.html">Log Status</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/data_acquisition_examples.html">Data Acquisition Examples</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/data_acquisition_service/README.html">Data Acquisition Service</a><ul>
<li class="toctree-l5"><a class="reference internal" href="../../python/examples/data_acquisition_service/signals_coreio_modem_plugin/README.html">Modem Signals</a></li>
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/service_faults/README.html">Faults</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/service_customization/custom_parameter_image_server/README.html">Custom Parameter Image Service</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/service_customization/custom_parameters_data_acquisition/README.html">Custom Parameter Data Acquisition Plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_image/README.html">Test Image Service Implementation with Get Image</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/post_docking_callbacks/README.html">Post Docking Callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/cloud_upload/README.html">Cloud Upload</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/comms_mapping/README.html">Comms image service</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/comms_mapping/README.html#how-to-use">How to use</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/data_acquisition_service/signals_coreio_modem_plugin/README.html">CoreIO Modem Signals Plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/tester_programs/README.html">Tester Programs</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/autonomy_and_missions_examples.html">Autonomy and Missions Examples</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/graph_nav_anchoring_optimization/README.html">Graph Nav Anchoring Optimization</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/graph_nav_command_line/README.html">GraphNav and Recording Service Command Line Interfaces</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/graph_nav_command_line/README.html#example-programs">Example Programs</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/graph_nav_extract_point_cloud/README.html">Graph Nav Extract Point Cloud</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/graph_nav_view_map/README.html">Graph Nav View Map</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/graph_nav_view_gps/README.html">Graph Nav View GPS Data</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/get_mission_state/README.html">Get Mission State</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/remote_mission_service/README.html">Remote Mission Service</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/mission_question_answerer/README.html">Mission Question Answerer</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/mission_recorder/README.html">Mission Recorder</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/replay_mission/README.html">Replay Mission</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/post_docking_callbacks/README.html">Post Docking Callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/area_callback/README.html">Area Callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/edit_autowalk/README.html">Edit Autowalk</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/record_autowalk/README.html">Record Autowalk</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/extract_images_from_walk/README.html">Extract Images from Autowalk</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/network_request_callback/README.html">Network Request Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/network_request_callback/README.html#id1">Network Request Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/remote_mission_service/spot_check/README.html">SpotCheck Mission Service</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/joint_control_examples.html">Joint Control API Examples</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../python/examples/docs/orbit.html">Orbit</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/hello_orbit/README.html">Hello Orbit</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/export_run_archives/README.html">Export Run Archives</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/export_site_walk_archives/README.html">Export Sitewalk Archives</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/anomalies/README.html">Anomalies</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/schedule_mission/README.html">Schedule Mission</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/runs_response/README.html">Runs Response</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/send_robot_back_to_dock/README.html">Return to Dock</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/toggle_mission_based_on_weather/README.html">Mission Toggle</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/webhook/README.html">Webhook</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/backups/README.html">Backups</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/webhook_integration/README.html">Webhook Integrations</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/examples/orbit/webhook_integration/README.html#example-overview">Example Overview</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../python/README.html">Python Reference Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/README.html">Client</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/area_callback.html">Area Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/area_callback_region_handler_base.html">Area Callback Region Handler</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/area_callback_service_runner.html">Area Callback Service Runner</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/area_callback_service_servicer.html">Area Callback Servicer</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/area_callback_service_utils.html">Area Callback Service Utils</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/arm_surface_contact.html">Arm Surface Contact</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/async_tasks.html">Async Tasks</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/audio_visual.html">Audio Visual</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/audio_visual_helpers.html">Audio Visual Helpers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/auth.html">Auth</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/auto_return.html">Auto Return</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/autowalk.html">Autowalk</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/bddf.html">BDDF</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/bddf_download.html">BDDF Download</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/channel.html">Channel</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/command_line.html">Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/common.html">Common</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/data_acquisition.html">Data Acquisition</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/data_acquisition_helpers.html">Data Acquisition Helpers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/data_acquisition_plugin.html">Data Acquisition Plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/data_acquisition_plugin_service.html">Data Acquisition Plugin Service</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/data_acquisition_store.html">Data Acquisition Store</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/data_buffer.html">Data Buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/data_chunk.html">Data Chunk</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/data_service.html">Data Service</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/directory_registration.html">Directory Registration</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/directory.html">Directory</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/docking.html">Docking</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/door.html">Door</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/estop.html">E-Stop</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/error_callback_result.html">Error Callback Result</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/exceptions.html">Exceptions</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/fault.html">Fault</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/frame_helpers.html">Frame Helpers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/graph_nav.html">Graph Nav</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/gripper_camera_param.html">Gripper Camera Params</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/gps/README.html">GPS</a><ul>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/gps/aggregator_client.html">Aggregator Client</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/gps/gps_listener.html">GPS Listener</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/gps/NMEAParser.html">NMEA Parser</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/gps/ntrip_client.html">NTRIP Client</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/gps/registration_client.html">Registration Client</a></li>
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/image.html">Image</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/image_service_helpers.html">Image Service Helpers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/inverse_kinematics.html">Inverse Kinematics</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/ir_enable_disable.html">IR Enable/Disable</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/keepalive.html">Keep Alive</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/lease.html">Lease</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/lease_resource_hierarchy.html">Lease Resource Hierarchy</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/lease_validator.html">Lease Validator</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/license.html">License</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/local_grid.html">Local Grid</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/log_status.html">Log Status</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/math_helpers.html">Math Helpers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/manipulation_api_client.html">Manipulation API</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/map_processing.html">Map Processing</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/metrics_logging.html">Metrics Logging</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/network_compute_bridge_client.html">Network Compute Bridge</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/payload_registration.html">Payload Registration</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/payload_software_update.html">Payload Software Update</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/payload_software_update_initiation.html">Payload Software Update Initiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/payload.html">Payload</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/point_cloud.html">Point Cloud</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/power.html">Power</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/processors.html">Processors</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/ray_cast.html">Ray casting</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/recording.html">Recording</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/robot_command.html">Robot Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/robot_id.html">Robot ID</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/robot.html">Robot</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/robot_state.html">Robot State</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/sdk.html">SDK</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/server_util.html">Server Util</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/service_customization_helpers.html">Service Customization Helpers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/signals_helpers.html">Signals Helpers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/README.html">Spot CAM</a><ul>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/audio.html">Audio</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/compositor.html">Compositor</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/health.html">Health</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/lighting.html">Lighting</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/lights_helper.html">Lights Helper</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/media_log.html">Media Log</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/network.html">Network</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/power.html">Power</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/ptz.html">PTZ</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/streamquality.html">Stream Quality</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_cam/version.html">Version</a></li>
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/spot_check.html">Spot Check</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/time_sync.html">Time Sync</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/token_cache.html">Token Cache</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/token_manager.html">Token Manager</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/units_helpers.html">Units Helpers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/util.html">Util</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/world_object.html">World Object</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/README.html">Core</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/README.html">BDDF</a><ul>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/base_data_reader.html">Base Data Reader</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/block_writer.html">Block Writer</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/bosdyn.html">BDDF Conventions</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/common.html">Common</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/data_reader.html">Data Reader</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/data_writer.html">Data Writer</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/file_indexer.html">File Indexer</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/grpc_proto_reader.html">GRPC Proto Reader</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/grpc_reader.html">GRPC Reader</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/grpc_service_reader.html">GRPC Service Reader</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/grpc_service_writer.html">GRPC Service Writer</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/message_reader.html">Message Reader</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/pod_series_reader.html">POD Series Reader</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/pod_series_writer.html">POD Series Writer</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/protobuf_channel_reader.html">Protobuf Channel Reader</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/protobuf_reader.html">Protobuf Reader</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/protobuf_series_writer.html">Protobuf Series Writer</a></li>
<li class="toctree-l5"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/bddf/stream_data_reader.html">Stream Data Reader</a></li>
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/geometry.html">Geometry</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/util.html">Util</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-core/src/bosdyn/deprecated.html">Deprecated</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/bosdyn-mission/src/bosdyn/mission/README.html">Mission</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-mission/src/bosdyn/mission/client.html">Client</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-mission/src/bosdyn/mission/constants.html">Constants</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-mission/src/bosdyn/mission/exceptions.html">Exceptions</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-mission/src/bosdyn/mission/remote_client.html">Remote Client</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-mission/src/bosdyn/mission/server_util.html">Server Util</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-mission/src/bosdyn/mission/util.html">Util</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/bosdyn-choreography-client/src/bosdyn/choreography/client/README.html">Choreography</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-choreography-client/src/bosdyn/choreography/client/choreography.html">Choreography</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-choreography-client/src/bosdyn/choreography/client/animation_file_to_proto.html">Animation File to Proto</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-choreography-client/src/bosdyn/choreography/client/animation_file_conversion_helpers.html">Animation File to Proto Helpers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/bosdyn-orbit/src/bosdyn/orbit/README.html">Orbit (formerly Scout)</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-orbit/src/bosdyn/orbit/client.html">Client</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-orbit/src/bosdyn/orbit/utils.html">Utils</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-orbit/src/bosdyn/orbit/exceptions.html">Exceptions</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../python/bosdyn-scout/src/bosdyn/scout/README.html">Scout (deprecated)</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-scout/src/bosdyn/scout/client.html">Client</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-scout/src/bosdyn/scout/utils.html">Utils</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../python/bosdyn-scout/src/bosdyn/scout/exceptions.html">Exceptions</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../python/fetch_tutorial/fetch1.html">Fetch Tutorial</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../python/fetch_tutorial/fetch2.html">Part 2: Training the Model</a></li>
<li class="toctree-l3"><a class="reference internal" href="../python/fetch_tutorial/fetch3.html">Part 3: Evaluating the Model</a></li>
<li class="toctree-l3"><a class="reference internal" href="../python/fetch_tutorial/fetch4.html">Part 4: Autonomous Pick Up</a></li>
<li class="toctree-l3"><a class="reference internal" href="../python/fetch_tutorial/fetch5.html">Part 5: Detecting People and Playing Fetch</a></li>
<li class="toctree-l3"><a class="reference internal" href="../python/fetch_tutorial/fetch6.html">Part 6: Running the model on Core IO</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../python/daq_tutorial/daq1.html">Data Collection Tutorial</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../python/daq_tutorial/daq2.html">Part 2: Capturing images</a></li>
<li class="toctree-l3"><a class="reference internal" href="../python/daq_tutorial/daq3.html">Part 3: Capturing other data</a></li>
<li class="toctree-l3"><a class="reference internal" href="../python/daq_tutorial/daq4.html">Part 4: Deploying to the CORE I/O</a></li>
<li class="toctree-l3"><a class="reference internal" href="../python/daq_tutorial/daq5.html">Part 5: Collecting data</a></li>
<li class="toctree-l3"><a class="reference internal" href="../python/daq_tutorial/daq6.html">Part 6: Processing collected data</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../payload/README.html">Payloads</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../payload/payload_configuration_requirements.html">Payload configuration requirements</a></li>
<li class="toctree-l2"><a class="reference internal" href="../payload/mechanical_interfaces.html">Mechanical interfaces</a></li>
<li class="toctree-l2"><a class="reference internal" href="../payload/robot_mounting_rails.html">Robot mounting rails</a></li>
<li class="toctree-l2"><a class="reference internal" href="../payload/guidelines_for_robust_payload_design.html">Guidelines for robust payload design</a></li>
<li class="toctree-l2"><a class="reference internal" href="../payload/robot_electrical_interface.html">Robot electrical interface</a></li>
<li class="toctree-l2"><a class="reference internal" href="../payload/coreio_documentation.html">CORE I/O Documentation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../payload/coreio_openvpn_extension.html">CORE I/O OpenVPN Extension</a></li>
<li class="toctree-l2"><a class="reference internal" href="../payload/configuring_payload_software.html">Configuring payload software</a></li>
<li class="toctree-l2"><a class="reference internal" href="../payload/docker_containers.html">Dockerize payload software</a></li>
<li class="toctree-l2"><a class="reference internal" href="../payload/spot_core_documentation.html">Pre-3.2 Spot CORE Documentation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../payload/spot_core_portainer.html">Configuring Docker containers in SpotCORE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../payload/spot_core_cockpit.html">Spot CORE system management tool: Cockpit</a></li>
<li class="toctree-l3"><a class="reference internal" href="../payload/spot_core_vnc.html">Spot CORE VNC</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../protos/README.html">API Protocol</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../protos/style_guide.html">Style Guide</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../protos/bosdyn/api/README.html">Proto Reference Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../protos/bosdyn/api/proto_reference.html">Protos</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../release_notes.html">Release Notes</a></li>
<li class="toctree-l1"><a class="reference external" href="https://github.com/boston-dynamics/spot-sdk">SDK Repository</a></li>
</ul>

        </div>
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../../README.html">Spot</a>
      </nav>

      <div class="wy-nav-content">
        <div class="rst-content">
          <div role="navigation" aria-label="Page navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="../../README.html" class="icon icon-home" aria-label="Home"></a></li>
          <li class="breadcrumb-item"><a href="README.html">Concepts</a></li>
          <li class="breadcrumb-item"><a href="data.html">Spot Data</a></li>
      <li class="breadcrumb-item active">Integrate a Payload with the Data Acquisition Pipeline</li>
      <li class="wy-breadcrumbs-aside">
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
             
  <!--
Copyright (c) 2023 Boston Dynamics, Inc.  All rights reserved.

Downloading, reproducing, distributing or otherwise using the SDK Software
is subject to the terms and conditions of the Boston Dynamics Software
Development Kit License (20191101-BDSDK-SL).
--><section id="integrate-a-payload-with-the-data-acquisition-pipeline">
<h1>Integrate a Payload with the Data Acquisition Pipeline<a class="headerlink" href="#integrate-a-payload-with-the-data-acquisition-pipeline" title="Permalink to this heading"></a></h1>
<p>The 2.1 release focuses on simplifying the integration of sensing payloads with the robot by creating the data acquisition pipeline. This document provides an overview of how a developer can write the necessary API services to integrate their sensor. The data acquisition pipeline will work with any payload, however different development steps are taken for a payload which collects image data (e.g. a 360 camera) and a payload which collects other data types and formats (e.g. a lidar or gas sensor).</p>
<p>To fully integrate the sensor, a payload needs to implement either the Boston Dynamics API <code class="docutils literal notranslate"><span class="pre">ImageService</span></code> or the <code class="docutils literal notranslate"><span class="pre">DataAcquisitionPluginService</span></code>, based on the type of data that will be collected and stored. These services will register with the directory service on robot, and the data acquisition service will automatically detect the new services and communicate with them for data acquisition requests. The following diagram shows the expected communication map.</p>
<p><img alt="Communication Map Screenshot" src="../../_images/payload_communication_map.png" /></p>
<section id="camera-payloads">
<h2>Camera Payloads<a class="headerlink" href="#camera-payloads" title="Permalink to this heading"></a></h2>
<p>To integrate a camera payload which outputs image data in a known format (e.g. raw bytes or JPEG) with the data acquisition pipeline, a developer needs to implement an <a class="reference external" href="../../protos/bosdyn/api/proto_reference.html#bosdyn-api-image-service-proto">ImageService</a>.</p>
<p>The data acquisition service will automatically recognize any directory-registered image services, create <code class="docutils literal notranslate"><span class="pre">ImageAcquisitionCapabilities</span></code> for the image sources, and be able to collect image data for each service using the standard <code class="docutils literal notranslate"><span class="pre">ImageService</span></code> RPCs. For a camera payload, a developer will need to implement an image servicer class. To simplify the implementation of an image service, a set of base image service helper functions are provided in <a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/image_service_helpers.html"><span class="doc">image_service_helpers.py</span></a>.</p>
<p>For each image source that will be available in the image service, a <code class="docutils literal notranslate"><span class="pre">VisualImageSource</span></code> helper class should be created to create the necessary protos for responding to gRPC requests from an image service, request and decode image data from the specific image source, and create or clear faults specific to the image source. The constructor requires the image source name to be provided (as a string), and then a class inheriting from the <code class="docutils literal notranslate"><span class="pre">CameraInterface</span></code> and overriding the functions for capturing image data and decoding the data. Optionally, the number of pixel rows and columns in the image can be provided as integer values in the <code class="docutils literal notranslate"><span class="pre">VisualImageSource</span></code> constructor. The gain and exposure time can be provided as either a function which dynamically determines the values or fixed float values in the <code class="docutils literal notranslate"><span class="pre">VisualImageSource</span></code> constructor as well.</p>
<p>The image service can be created with the <code class="docutils literal notranslate"><span class="pre">CameraBaseImageServicer</span></code> class, which is a helper class that will manage state and respond to the RPCs required of an image service (<code class="docutils literal notranslate"><span class="pre">ListImageSources</span></code> RPC and <code class="docutils literal notranslate"><span class="pre">GetImage</span></code> RPC). The constructor of the image service helper class requires a developer to provide the sdk robot instance, the service name, and a list of <code class="docutils literal notranslate"><span class="pre">VisualImageSource</span></code>’s which will represent the image sources available for capture from this image service.</p>
<section id="camerainterface">
<h3>CameraInterface<a class="headerlink" href="#camerainterface" title="Permalink to this heading"></a></h3>
<p>Each image source should implement a class which inherits the parent class <code class="docutils literal notranslate"><span class="pre">CameraInterface</span></code> and overrides the virtual functions <code class="docutils literal notranslate"><span class="pre">blocking_capture</span></code> and <code class="docutils literal notranslate"><span class="pre">image_decode</span></code>.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">blocking_capture</span></code> interface function should be a blocking function which calls out to a camera using the hardware’s api, and collects then returns the image data. The virtual function has the following signature:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">blocking_capture</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">returns</span> <span class="p">(</span><span class="n">image_data</span><span class="p">:</span> <span class="s2">&quot;Any Data Format&quot;</span><span class="p">,</span> <span class="n">acquisition_time_seconds</span><span class="p">:</span> <span class="nb">float</span><span class="p">)</span>
</pre></div>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">image_data</span></code> returned can be any type, but must be consistent across the capture function’s output and the decode function’s input. The <code class="docutils literal notranslate"><span class="pre">acquisition_time_seconds</span></code> should be a float, in the service computer’s clock, which represents the time the image data was acquired.
<strong>The <code class="docutils literal notranslate"><span class="pre">blocking_capture</span></code> function must not return until the image_data has been acquired.</strong></p>
<p>The <code class="docutils literal notranslate"><span class="pre">image_decode</span></code> interface function should decode the image data into bytes in the desired format and populate an image proto message with the decoded data. The virtual function has the following signature:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">image_decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image_data</span> <span class="p">:</span> <span class="s2">&quot;Any Data Format&quot;</span><span class="p">,</span> <span class="n">image_proto</span><span class="p">:</span> <span class="n">image_pb2</span><span class="o">.</span><span class="n">Image</span><span class="p">,</span> <span class="n">image_format</span> <span class="p">:</span> <span class="n">image_pb2</span><span class="o">.</span><span class="n">Image</span><span class="o">.</span><span class="n">Format</span><span class="p">,</span> <span class="n">quality_percent</span> <span class="p">:</span> <span class="nb">int</span><span class="p">)</span>
</pre></div>
</div>
<p>The input image data will always be the same format (and contents) as the image data returned by the <code class="docutils literal notranslate"><span class="pre">blocking_capture</span></code> function. The <code class="docutils literal notranslate"><span class="pre">image_proto</span></code> is an Image protobuf message which will be mutated within the decode function to include: 1) the image data, 2) the pixel format, 3) the image format, and 4) optionally the transform snapshot fields. The decoding function does not need to return anything, but it must mutate the image protobuf message.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">image_format</span></code> is the requested format (e.g. jpeg, raw); if the image data cannot be decoded into a specific format, an Exception should be raised within the <code class="docutils literal notranslate"><span class="pre">image_decode</span></code> function providing an error message (e.x. <code class="docutils literal notranslate"><span class="pre">raise</span> <span class="pre">Exception(&quot;Unable</span> <span class="pre">to</span> <span class="pre">decode</span> <span class="pre">to</span> <span class="pre">FORMAT_RAW</span> <span class="pre">for</span> <span class="pre">the</span> <span class="pre">web</span> <span class="pre">cam&quot;)</span></code>). If the requested image format is <code class="docutils literal notranslate"><span class="pre">None</span></code>, then the <code class="docutils literal notranslate"><span class="pre">image_decode</span></code> function should choose the best/preferred format for the image data and decode it into that format.</p>
<p>Lastly, the <code class="docutils literal notranslate"><span class="pre">quality_percent</span></code> may be provided as a parameter for decoding the image data.</p>
<p><strong>Note:</strong> The tablet and the on-robot data acquisition service makes requests for JPEG formatted images, so the <code class="docutils literal notranslate"><span class="pre">image_decode</span></code> function must at least be able to respond to a <code class="docutils literal notranslate"><span class="pre">image_format=image_pb2.Image.FORMAT_JPEG</span></code> to ensure that the camera payload can be viewed on the tablet.</p>
<p><strong>Note:</strong> Does your camera service require inputs or parameters? Do you want controls or widgets for those parameters to show up on the SpotApp android application or on Orbit? Please refer to <a class="reference internal" href="service_customization.html"><span class="doc">this document</span></a> to learn how to add parameters to a camera service.</p>
</section>
<section id="using-background-capture-threads">
<h3>Using Background Capture Threads<a class="headerlink" href="#using-background-capture-threads" title="Permalink to this heading"></a></h3>
<p>The image service’s <code class="docutils literal notranslate"><span class="pre">GetImage</span></code> RPC retrieves images, based on the image source requested, from the payload using the camera’s API (e.g. OpenCV) and converts them into the <code class="docutils literal notranslate"><span class="pre">bosdyn.api.Image</span></code> proto message to be returned by the service. This RPC is meant to complete “quickly” when communicating with the payload and returning the collected images. To enable a fast response to the RPC for slower captures, the <code class="docutils literal notranslate"><span class="pre">CameraBaseImageServicer</span></code> image service constructor has the argument <code class="docutils literal notranslate"><span class="pre">use_background_capture_thread</span></code>, which when set to True will create a background thread for each image source that will continuously fetch images from the camera payloads and keep a buffer of these images to reduce the latency when responding to the RPC. The <code class="docutils literal notranslate"><span class="pre">CameraBaseImageServicer</span></code> will then respond to a <code class="docutils literal notranslate"><span class="pre">GetImage</span></code> RPC with the most recent image stored in the buffer from the capture thread, instead of calling out to the service. By default, an image service will have <code class="docutils literal notranslate"><span class="pre">use_background_capture_thread</span></code> set to True and create threads for each image source.</p>
<p>When <code class="docutils literal notranslate"><span class="pre">use_background_capture_thread</span></code> is set to False, the <code class="docutils literal notranslate"><span class="pre">CameraBaseImageServicer</span></code> will make the call to the <code class="docutils literal notranslate"><span class="pre">blocking_capture</span></code> function during the completion of the RPC.</p>
</section>
<section id="example-image-service">
<h3>Example Image Service<a class="headerlink" href="#example-image-service" title="Permalink to this heading"></a></h3>
<p>There is an SDK example showing an <code class="docutils literal notranslate"><span class="pre">ImageService</span></code> implementation using the helper functions: a <a class="reference internal" href="../../python/examples/service_customization/custom_parameter_image_server/README.html"><span class="doc">USB web camera</span></a>.</p>
</section>
<section id="tips-for-creating-an-image-service">
<h3>Tips for Creating an Image Service<a class="headerlink" href="#tips-for-creating-an-image-service" title="Permalink to this heading"></a></h3>
<ul>
<li><p>The <code class="docutils literal notranslate"><span class="pre">image_decode</span></code> function should attempt to accurately fill out the PixelFormat and ImageFormat fields for the image proto in addition to the image data. This allows for end-user applications to more accurately decode the image data.</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">image_decode</span></code> function should handle an input argument of <code class="docutils literal notranslate"><span class="pre">image_format=None</span></code>. Therefore, if the <code class="docutils literal notranslate"><span class="pre">image_format</span></code> is <code class="docutils literal notranslate"><span class="pre">None</span></code>, the <code class="docutils literal notranslate"><span class="pre">image_decode</span></code> function should choose the best/preferred format and respond with image data decoded into that format and set the ImageFormat field to the chosen format in the image proto.</p></li>
<li><p>To have a specific camera source run a background thread, but other sources in the same service run the <code class="docutils literal notranslate"><span class="pre">blocking_capture</span></code> function at RPC time, provide <code class="docutils literal notranslate"><span class="pre">use_background_capture_thread</span></code> as False to the <code class="docutils literal notranslate"><span class="pre">CameraBaseImageServicer</span></code> constructor. Separately, for the <code class="docutils literal notranslate"><span class="pre">VisualImageSource</span></code> object, start the thread using the <code class="docutils literal notranslate"><span class="pre">create_capture_thread()</span></code> function before passing the list of sources to the image service constructor. The following is pseudocode demonstrating the process:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">visual_source1</span> <span class="o">=</span> <span class="n">VisualImageSource</span><span class="p">(</span><span class="s2">&quot;source1&quot;</span><span class="p">,</span> <span class="n">camera_interface_object</span><span class="p">)</span>
<span class="n">visual_source2_not_threaded</span> <span class="o">=</span> <span class="n">VisualImageSource2</span><span class="p">(</span><span class="s2">&quot;source2&quot;</span><span class="p">,</span> <span class="n">camera_interface_object</span><span class="p">)</span>
<span class="n">visual_source1</span><span class="o">.</span><span class="n">create_capture_thread</span><span class="p">()</span>
<span class="n">CameraBaseImageServicer</span><span class="p">(</span><span class="n">robot</span><span class="p">,</span> <span class="s2">&quot;image-service-name&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">visual_source1</span><span class="p">,</span> <span class="n">visual_source2_not_threaded</span><span class="p">],</span> <span class="n">use_background_capture_thread</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</pre></div>
</div>
</li>
<li><p>While developing an image service, if the service is not behaving as expected or failing unexpectedly, an image service tester program (<code class="docutils literal notranslate"><span class="pre">python/examples/tester_programs/image_service_tester.py</span></code>) is available to help test and debug common failure modes through detailed display of the system’s outputs.</p></li>
</ul>
</section>
</section>
<section id="non-image-payloads">
<h2>Non-image Payloads<a class="headerlink" href="#non-image-payloads" title="Permalink to this heading"></a></h2>
<p>To integrate a payload which outputs a different, non-image format of data with the data acquisition pipeline, a developer needs to implement a <a class="reference external" href="../../protos/bosdyn/api/proto_reference.html#bosdyn-api-data-acquisition-plugin-service-proto">DataAcquisitionPluginService</a>.</p>
<p>A directory-registered DataAcquisitionPluginService will be automatically recognized by the data acquisition service on robot. The plugin service will collect the necessary payload data to respond to requests for its specific data captures from the data acquisition service. To simplify the implementation of a plugin service, a set of base plugin service helper functions are provided in <a class="reference internal" href="../../python/bosdyn-client/src/bosdyn/client/data_acquisition_plugin_service.html"><span class="doc">data_acquisition_plugin_service.py</span></a>.</p>
<p>The plugin service can be created with the <code class="docutils literal notranslate"><span class="pre">DataAcquisitionPluginService</span></code> class, which is a helper class that will manage state and respond to the RPCs required of a plugin service. The constructor of the plugin service helper class requires a developer to provide 1) a list of the data capabilities that the service can collect data, and 2) a function to collect this data.</p>
<section id="data-capabilities-list">
<h3>Data Capabilities List<a class="headerlink" href="#data-capabilities-list" title="Permalink to this heading"></a></h3>
<p>For each piece of data that will be collected from the payload, the plugin service must specify:</p>
<ul class="simple">
<li><p>Name: uniquely identifies which piece of data will be collected.</p></li>
<li><p>Description: a short, human-readable description of what data is being collected. This description will be displayed on the tablet when configuring data collection actions during teleop and autowalk.</p></li>
<li><p>Channel name: a string that will be associated with all data collected and stored by this plugin service in the data buffer.</p>
<ul>
<li><p>It is recommended to put different kinds of captures on different channels. If you want to store multiple pieces of data on the same channel during the same capture action, please set the <code class="docutils literal notranslate"><span class="pre">data_name</span></code> in the <code class="docutils literal notranslate"><span class="pre">DataIdentifier</span></code>, so that the pieces of data can still be uniquely identified.</p></li>
</ul>
</li>
</ul>
<p>Using this information, the data acquisition plugin will create a list of capabilities, which are <code class="docutils literal notranslate"><span class="pre">Capability(name,</span> <span class="pre">description,</span> <span class="pre">channel_name)</span></code>. For example, a plugin collecting laser scan data that can be both sparse and dense would have the following capabilities list:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>kCapabilities = [Capability(name=”sparse&quot;, description=&quot;Sparse laser scan&quot;, channel_name=”laser_scan_sparse”), Capability(name=&quot;dense&quot;, description=&quot;Dense laser scan&quot;, channel_name=”laser_scan_dense”)]
</pre></div>
</div>
<p>This list of capabilities will be passed to the <code class="docutils literal notranslate"><span class="pre">DataAcquisitionPluginService</span></code> class’s constructor and be used to respond to the <code class="docutils literal notranslate"><span class="pre">GetServiceInfo</span></code> RPC.</p>
</section>
<section id="data-collection-function">
<h3>Data Collection Function<a class="headerlink" href="#data-collection-function" title="Permalink to this heading"></a></h3>
<p>In addition to the capabilities, the plugin service must implement a data collection function, which will collect all requested data and store it in the data acquisition store service. This data collection function will run when the plugin service receives a <code class="docutils literal notranslate"><span class="pre">AcquirePluginData</span></code> RPC. The data collection function must have the following signature:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">data_collect_fn</span><span class="p">(</span><span class="n">request</span> <span class="p">:</span> <span class="n">AcquirePluginDataRequest</span><span class="p">,</span> <span class="n">store_helper</span> <span class="p">:</span>  <span class="n">DataAcquisitionStoreHelper</span><span class="p">)</span>
</pre></div>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">request</span></code> argument is the <code class="docutils literal notranslate"><span class="pre">AcquirePluginDataRequest</span></code>, which has the <code class="docutils literal notranslate"><span class="pre">acquisition_requests</span></code> field that contains a list of data captures that should be collected and saved by the plugin service. The <code class="docutils literal notranslate"><span class="pre">store_helper</span></code>argument is a <code class="docutils literal notranslate"><span class="pre">DataAcquisitionStoreHelper</span></code> which will be called to save the collected data.</p>
<p>It is important to note that the data collection function should <strong>block for the entire process</strong> of collecting the payload data and storing it in the data acquisition store service, and not return until all data is collected and has been stored.</p>
<p>The data collection function should perform the following things for each <code class="docutils literal notranslate"><span class="pre">DataCapture</span></code> requested in the <code class="docutils literal notranslate"><span class="pre">acquisition_requests</span></code> list passed as an argument to the function:</p>
<ol>
<li><p>Create a <code class="docutils literal notranslate"><span class="pre">DataIdentifier</span></code> from the acquisition request’s <code class="docutils literal notranslate"><span class="pre">action_id</span></code> field. This data identifier will be stored with all of the collected data. If the same channel is used for all of the plugin’s data capabilities, then the <code class="docutils literal notranslate"><span class="pre">data_name</span></code> field should be populated with the data capture’s <code class="docutils literal notranslate"><span class="pre">name</span></code> field.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">data_id</span> <span class="o">=</span> <span class="n">data_acquisition_pb2</span><span class="o">.</span><span class="n">DataIdentifier</span><span class="p">(</span><span class="n">action_id</span><span class="o">=</span><span class="n">request</span><span class="o">.</span><span class="n">action_id</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="n">CHANNEL_NAME</span><span class="p">,</span> <span class="n">data_name</span><span class="o">=</span><span class="n">DATA_NAME</span><span class="p">)</span>
</pre></div>
</div>
</li>
<li><p>Collect the data by communicating with the payload.</p>
<ul class="simple">
<li><p>Note: Long-running acquisitions should be sure to call <code class="docutils literal notranslate"><span class="pre">store_helper.state.cancel_check()</span></code> occasionally to exit early and cleanly if the acquisition has been cancelled by the user or a timeout.</p></li>
</ul>
</li>
<li><p>Store the data in the data acquisition store service using the <code class="docutils literal notranslate"><span class="pre">store_helper</span></code>. The data can either be stored as <code class="docutils literal notranslate"><span class="pre">AssociatedMetadata</span></code>, which is json structured data, or as raw bytes data.</p></li>
<li><p>To save data as raw bytes, the <code class="docutils literal notranslate"><span class="pre">store_data</span></code> function is used.</p>
<ul class="simple">
<li><p>Tip: if the collected data is a protobuf message, the protobuf <code class="docutils literal notranslate"><span class="pre">SerializeToString()</span></code> function will convert the proto into bytes.</p></li>
</ul>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">store_helper</span><span class="o">.</span><span class="n">store_data</span><span class="p">(</span><span class="n">BYTES_DATA</span><span class="p">,</span> <span class="n">data_id</span><span class="p">)</span>
</pre></div>
</div>
</li>
<li><p>To save data as associated metadata, the <code class="docutils literal notranslate"><span class="pre">store_metadata</span></code> function is used. The <code class="docutils literal notranslate"><span class="pre">AssociatedMetadata</span></code> proto message is used to package the json data, and the <code class="docutils literal notranslate"><span class="pre">reference_id</span></code> of that proto should include the <code class="docutils literal notranslate"><span class="pre">request.action_id</span></code>.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>message = data_acquisition_pb2.AssociatedMetadata()
message.reference_id.action_id.CopyFrom(request.action_id)
message.metadata.data.update({
  &quot;data&quot;: “special_data”
})
store_helper.store_metadata(message, data_id)
</pre></div>
</div>
<p>Note, the <code class="docutils literal notranslate"><span class="pre">DataAcquisitionPluginService</span></code> class will wait to respond to the <code class="docutils literal notranslate"><span class="pre">AcquirePluginData</span></code> RPC until all data is collected and all store calls have been completed.</p>
</li>
</ol>
</section>
<section id="example-plugins">
<h3>Example Plugins<a class="headerlink" href="#example-plugins" title="Permalink to this heading"></a></h3>
<p>There are a couple <a class="reference internal" href="../../python/examples/data_acquisition_service/README.html"><span class="doc">example plugin services</span></a> which show data collection, creating associated metadata, and storing the data for the following types of payloads: Piksi GPS, PointCloud services, and generic GPS metadata.</p>
</section>
<section id="error-reporting">
<h3>Error Reporting<a class="headerlink" href="#error-reporting" title="Permalink to this heading"></a></h3>
<p>If a failure occurs in the plugin service, an error can be reported to the data acquisition service. If the collection of a specific piece of data fails, a <code class="docutils literal notranslate"><span class="pre">DataError</span></code> can be returned with the request’s specific <code class="docutils literal notranslate"><span class="pre">DataIdentifier</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>store_helper.state.add_errors([make_error(data_id, “Error Message!”)])
</pre></div>
</div>
<p>If the plugin service encounters an error that is unrelated to a specific piece of data, the data collection function can raise an <code class="docutils literal notranslate"><span class="pre">Exception</span></code>. This exception will be caught by the base <code class="docutils literal notranslate"><span class="pre">DataAcquisitionPluginService</span></code> class and will cause the <code class="docutils literal notranslate"><span class="pre">AcquirePluginData</span></code> RPC to respond with a <code class="docutils literal notranslate"><span class="pre">STATUS_INTERNAL_ERROR</span></code>. The data acquisition service will create a <code class="docutils literal notranslate"><span class="pre">PluginError</span></code> for this acquisition failure, which will appear in a <code class="docutils literal notranslate"><span class="pre">GetStatus</span></code> RPC sent to the data acquisition service.</p>
</section>
<section id="tips-for-creating-a-data-acquisition-plugin">
<h3>Tips for Creating a Data Acquisition Plugin<a class="headerlink" href="#tips-for-creating-a-data-acquisition-plugin" title="Permalink to this heading"></a></h3>
<ul>
<li><p>Typically, a plugin will acquire all the requested data at once before storing any data with the <code class="docutils literal notranslate"><span class="pre">store_helper</span></code>. This allows a plugin to accurately set the status as <code class="docutils literal notranslate"><span class="pre">STATUS_SAVING</span></code> to indicate that all acquisitions are complete and provide feedback for the <code class="docutils literal notranslate"><span class="pre">GetStatus</span></code> RPC before beginning to store its data. As well, a plugin can check if it has been cancelled before saving any data to prevent accidentally storing data for a later cancelled request.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">store_helper</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">set_status</span><span class="p">(</span><span class="n">data_acquisition_pb2</span><span class="o">.</span><span class="n">GetStatusResponse</span><span class="o">.</span><span class="n">STATUS_SAVING</span><span class="p">)</span>
</pre></div>
</div>
</li>
<li><p>While developing a data acquisition plugin service, if the service is not behaving as expected or failing unexpectedly, a plugin tester program (<code class="docutils literal notranslate"><span class="pre">python/examples/tester_programs/plugin_tester.py</span></code>) is available to help test and debug common failure modes through detailed display of the system’s outputs.</p></li>
<li><p>The data collection function can be part of its own class that manages state specific to the payload. Additionally, if an individual class is created for the data collection and management, it can use background threads to collect and buffer data to speed up the response to the <code class="docutils literal notranslate"><span class="pre">AcquirePluginData</span></code> RPC.</p></li>
<li><p>The data acquisition service will mark acquisition requests as <code class="docutils literal notranslate"><span class="pre">STATUS_TIMEDOUT</span></code> if they take longer than 30 seconds. A plugin can extend the timeout used by providing an additional function following this signature:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">acquire_response_fn</span><span class="p">(</span><span class="n">request</span><span class="p">:</span><span class="n">data_acquisition_pb2</span><span class="o">.</span><span class="n">AcquirePluginDataRequest</span><span class="p">,</span> <span class="n">response</span><span class="p">:</span><span class="n">data_acquisition_pb2</span><span class="o">.</span><span class="n">AcquirePluginDataResponse</span><span class="p">):</span> <span class="n">returns</span> <span class="n">Boolean</span>
</pre></div>
</div>
<p>The acquire response function can verify the request header and check if the acquisition request is valid. If it is not, the <code class="docutils literal notranslate"><span class="pre">response</span></code> argument should be modified to set the <code class="docutils literal notranslate"><span class="pre">status</span></code> field. As well, the timeout can be extended for valid functions by updating the response’s <code class="docutils literal notranslate"><span class="pre">timeout_deadline</span></code> field. Note, the timeout should be set in the robot’s clock. Ultimately, the acquire response function will respond with a boolean indicating if the acquisition request is valid, and if so, the data collection will continue.</p>
</li>
<li><p>If a plugin’s data collection is slow, it should periodically check if the RPC is ever cancelled so that it can immediately stop the no longer necessary data collection. Within the data collection function, to check if an acquisition is cancelled:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">store_helper</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">cancel_check</span><span class="p">()</span>
</pre></div>
</div>
</li>
<li><p>Be careful using async functions within the data collection function for communicating with the payload. The service architecture expects the data collection process to block until all data is completely collected and stored.</p></li>
</ul>
</section>
<section id="attaching-metadata-with-other-data-or-images">
<h3>Attaching Metadata with other Data or Images<a class="headerlink" href="#attaching-metadata-with-other-data-or-images" title="Permalink to this heading"></a></h3>
<p>Additional metadata, such as the robot state or sensor configuration information, can be stored in association with external data collected by a plugin or images from image services. To save metadata linked with each piece of data, a DataAcquisitionPluginService can be created to collect and save this metadata. This plugin will list capture actions representing each piece of additional metadata. The plugin will receive an <code class="docutils literal notranslate"><span class="pre">AcquirePluginData</span></code> request from the data acquisition service on robot, which will contain a repeated list of <code class="docutils literal notranslate"><span class="pre">DataIdentifiers</span></code> that the metadata plugin can use to store metadata associated to these identified pieces of data.</p>
<p>The metadata will be configured as JSON data, and can be stored as an <code class="docutils literal notranslate"><span class="pre">AssociatedMetadata</span></code> proto. This proto contains a <code class="docutils literal notranslate"><span class="pre">reference_id</span></code> field, which will be the <code class="docutils literal notranslate"><span class="pre">DataIdentifier</span></code> from the data it should be associated with; if only the <code class="docutils literal notranslate"><span class="pre">action_id</span></code> of that identifier is filled out, than the metadata is associated with the entire action (all of the repeated data identifiers).</p>
<p>A plugin can store this associated metadata using the store helper with the <code class="docutils literal notranslate"><span class="pre">AssociatedMetadata</span></code> proto and a new <code class="docutils literal notranslate"><span class="pre">DataIdentifier</span></code> which uniquely identifies the associated metadata (and not what the metadata is referencing):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">store_helper</span><span class="o">.</span><span class="n">store_metadata</span><span class="p">(</span><span class="n">associated_metadata_proto</span><span class="p">,</span> <span class="n">data_id</span><span class="p">)</span>
</pre></div>
</div>
<p>When downloading or retrieving the data from the data acquisition store, the metadata saved with each action will also be retrieved and can easily be linked back to the data it is stored with.</p>
</section>
</section>
<section id="directory-registration-and-running-the-new-service">
<h2>Directory Registration and Running the New Service<a class="headerlink" href="#directory-registration-and-running-the-new-service" title="Permalink to this heading"></a></h2>
<p>The new service, either a data acquisition plugin service or an image service, must be running and registered with the directory to communicate with the robot and the data acquisition service. This requires a unique service name, service type (“bosdyn.api.DataAcquisitionPluginService” or “bosdyn.api.ImageService”), and a service authority.</p>
<p>The payload computer running the new service should perform payload authentication using the GUID/secret of the payload before registering the service with the directory.</p>
</section>
<section id="testing-the-new-service">
<h2>Testing the New Service<a class="headerlink" href="#testing-the-new-service" title="Permalink to this heading"></a></h2>
<p>For DataAcquisitionPluginService and ImageService services, there are <a class="reference internal" href="../../python/examples/tester_programs/README.html"><span class="doc">tester programs</span></a> available which will check the communication and directory registration of the new service, as well as the API service’s specific functionalities. The plugin tester scripts should be run while the new service is also running and will print output to the terminal about any errors or warnings that occurred while running the tests.</p>
<p>For other types of services, the general service checking helper functions are available within the tester_programs example and can be used to check directory registration, gRPC communication with the service, and if there are active service faults for the service. Other debugging tools include the different API examples that exercise a specific service type (e.g. the <a class="reference internal" href="../../python/examples/get_image/README.html"><span class="doc">get_image example</span></a>) or the command line, which can list the full set of options and actions available by running the command:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">bosdyn</span><span class="o">.</span><span class="n">client</span> <span class="p">{</span><span class="n">ROBOT_IP</span><span class="p">}</span> <span class="o">--</span><span class="n">help</span>
</pre></div>
</div>
</section>
</section>


           </div>
          </div>
          <footer>
  

  <hr/>

  <div role="contentinfo">
    <p>
      
      &copy; Copyright 2025 Boston Dynamics. All rights reserved.
      <a href="https://www.bostondynamics.com/privacy-policy">Privacy Policy</a> | 
      <a href="https://www.bostondynamics.com/terms">Terms of Use</a>

    </p>
  </div> 

</footer>
        </div>
      </div>
    </section>
  </div>
  <script>
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(false);
      });
  </script>
    <!-- Theme Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXX-1"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());

      gtag('config', 'UA-XXXXXXX-1', {
          'anonymize_ip': false,
      });
    </script> 

</body>
</html>